/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Test;

import java.util.ArrayList;
import java.util.List;

/**
 * http://latecladeescape.com/algoritmos/1118-area-de-un-poligono-irregular-producto-en-cruz
 * @author ivanpianetti
 */
public class AreaPoligono {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Poligono p = new Poligono();
        p.nuevoVertice(new Punto(2, 3));
        p.nuevoVertice(new Punto(7, 1));
        p.nuevoVertice(new Punto(5, 7));
        System.out.println(p.getArea());
    }

    static class Punto {

        public double x, y;

        public Punto(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }

    /**
     * lista de vértices Suponemos que siguen sentido horario o antihorario y
     * que ningún segmento cruza a otro, cada vértice aparece una sola vez
     * en la lista y el último se une al primero.
     */
    static class Poligono {

        List<Punto> vertices = new ArrayList<Punto>();

        public void nuevoVertice(Punto p) {
            vertices.add(p);
        }

        /**
         * Sólo calculamos si el polígono tiene al menos tres vértices
         *
         * @return Area
         */
        public double getArea() {
            double suma = 0;
            int i;
            if (vertices.size() >= 3) {
                //producto en cruz desde 1 hasta n-1
                for (i = 0; i < vertices.size() - 1; i++) {
                    suma += vertices.get(i).x * vertices.get(i + 1).y - vertices.get(i).y * vertices.get(i + 1).x;
                }
                i = vertices.size() - 1;
                suma += vertices.get(i).x * vertices.get(0).y - vertices.get(i).y * vertices.get(0).x;
            }
            return Math.abs(suma) / 2;
        }
    }
}
